#include "add_ocr_text.h"
#include <filesystem>

//判断一个文件是否存在
void File_existence_judgment(const std::string &filename)
{
    
    if ( std::filesystem::exists(filename) )
    {
        //文件存在
        ;
    } else
    {
        //文件不存在
        std::cout << "Please check: " << filename << " does not exist." << std::endl;
        exit(0);
    }
}


//页面尺寸
std::pair <double, double> Get_page_size(const std::string page_name)
{
    double X,Y;
    if( page_name == "A3" )
    {
        X=297;
        Y=420;
        
    }
    else if  ( page_name == "A4" )
    {
        X=210;
        Y=297;
    }
    else if ( page_name == "A5" )
    {
        X=148;
        Y=210;
    }
    else if  ( page_name == "B3" )
    {
        X=353;
        Y=500;
    }
    else if  ( page_name == "B4" )
    {
        X=250;
        Y=353;
    }
    else if  ( page_name == "B5" )
    {
        X=176;
        Y=250;
    }
    else
    {
        std::cout << "纸张类型错误" << std::endl; 
        exit(1);
    }
    
    //上面的单位是 毫米 ，需换算到 点/磅 (point)
    X=X/25.4*72;
    Y=Y/25.4*72;
    
    return std::make_pair(X, Y);
}



//读取文件数据
void Get_date(std::vector <std::string> *info_picture, std::vector <std::string> *info_text,
              std::vector <std::pair<int, int>> * info_coord_1,
              std::vector <std::pair<int, int>> * info_coord_2,
              std::vector <std::pair<int, int>> *  info_coord_3,
              std::vector <std::pair<int, int>> * info_coord_4,
              const std::string input_name,
              const int Box_x_fine_tuning=0, //对文本框坐标进行微调，单位是像素
              const int Box_y_fine_tuning=0)
{
    int i=0;
    int val[2];
    
    std::string str_0,str_1,temp_text[6]; //临时变量
    
    std::ifstream file(input_name); //读取输入文件
    
    while (std::getline(file, str_0)) //读取每一行
    {
        i=0; //归零
        std::stringstream sss(str_0);
        
        while (std::getline(sss, str_1, '\t')) //将每一行按Tab分隔
        {
            temp_text[i]=str_1;
            //cout << str_1 << endl;
            i++;
        }
        
        if(temp_text[1]==" ") //纯空白符号跳过
        {
            continue;
        }
        
        //获得相应数据
        info_picture->push_back(temp_text[0]); //图片名
        
        //末尾添加元素
        info_text->push_back(temp_text[1]); // 字符串
        
        
        //获取第一个坐标
        i=0;
        std::stringstream sss1(temp_text[2]);
        
        while (std::getline(sss1, str_1, ',')) //坐标按 , 分隔
        {
            val[i]=stoi(str_1);
            //cout << val[i] << endl;
            i++;
        }
        info_coord_1->push_back({val[0]+Box_x_fine_tuning,val[1]+Box_y_fine_tuning});
        
        //获取第二个坐标
        i=0;
        std::stringstream sss2(temp_text[3]);
        
        while (std::getline(sss2, str_1, ',')) //坐标按 , 分隔
        {
            val[i]=stoi(str_1);
            //cout << val[i] << endl;
            i++;
        }
        info_coord_2->push_back({val[0]+Box_x_fine_tuning,val[1]+Box_y_fine_tuning});
        
        //获取第三个坐标
        i=0;
        std::stringstream sss3(temp_text[4]);
        
        while (std::getline(sss3, str_1, ',')) //坐标按 , 分隔
        {
            val[i]=stoi(str_1);
            //cout << val[i] << endl;
            i++;
        }
        
        info_coord_3->push_back({val[0]+Box_x_fine_tuning,val[1]+Box_y_fine_tuning});
        
        //获取第四个坐标
        i=0;
        std::stringstream sss4(temp_text[5]);
        
        while (std::getline(sss4, str_1, ',')) //坐标按 , 分隔
        {
            val[i]=stoi(str_1);
            //cout << val[i] << endl;
            i++;
        }
        
        info_coord_4->push_back({val[0]+Box_x_fine_tuning,val[1]+Box_y_fine_tuning});
    }
}



// 将图片的坐标原点换算为当前左下角的坐标原点
// 这里只是将原点换成图片的左下角，并不是页面的原点
void Coordinate_origin_transform(std::vector <std::pair<int, int>> * info_coord_1,
                                 std::vector <std::pair<int, int>> * info_coord_2,
                                 std::vector <std::pair<int, int>> *  info_coord_3,
                                 std::vector <std::pair<int, int>> * info_coord_4,
                                 const DoubleAndDoublePair picD,
                                 const int origin_state=1, //默认值为 4 ，即左上
                                 const int i_start=0, //相关内容的索引编号
                                 const int i_end=1 )
{
    switch(origin_state) 
    {
        case 1: // lower-left
            // 左下保持不动
            break;
        case 2: // lower-right 
            // 右下: (a,b) → (X-a,b)
            for(int i=i_start; i < i_end; i++)
            {
                (*info_coord_1)[i].first = picD.first - (*info_coord_1)[i].first;
                (*info_coord_2)[i].first = picD.first - (*info_coord_2)[i].first;
                (*info_coord_3)[i].first = picD.first - (*info_coord_3)[i].first;
                (*info_coord_4)[i].first = picD.first - (*info_coord_4)[i].first;
            }
            break;
        case 3: //upper-right
            // 右上: (a,b) → (X-a,Y-b)
            for(int i=i_start; i < i_end; i++)
            {
                (*info_coord_1)[i].first = picD.first - (*info_coord_1)[i].first;
                (*info_coord_2)[i].first = picD.first - (*info_coord_2)[i].first;
                (*info_coord_3)[i].first = picD.first - (*info_coord_3)[i].first;
                (*info_coord_4)[i].first = picD.first - (*info_coord_4)[i].first;
                
                (*info_coord_1)[i].second = picD.second - (*info_coord_1)[i].second;
                (*info_coord_2)[i].second = picD.second - (*info_coord_2)[i].second;
                (*info_coord_3)[i].second = picD.second - (*info_coord_3)[i].second;
                (*info_coord_4)[i].second = picD.second - (*info_coord_4)[i].second;
            }
            break;
        case 4: // upper-left
            // 左上 (a,b) → (a,Y-b)
            for(int i=i_start; i < i_end; i++)
            {
                
                (*info_coord_1)[i].second = picD.second - (*info_coord_1)[i].second;
                (*info_coord_2)[i].second = picD.second - (*info_coord_2)[i].second;
                (*info_coord_3)[i].second = picD.second - (*info_coord_3)[i].second;
                (*info_coord_4)[i].second = picD.second - (*info_coord_4)[i].second;
            }
            break;
        default:
            std::cout << "原点位置错误" << std::endl;
            exit(1);
            // code block
    }
}


//计算图片的缩放比例
double Get_picture_scale(std::pair <double, double> p, DoubleAndDoublePair picD)
{
    double scale_ratio;
    
    double(picD.first/picD.second) > double (p.first/p.second) ? scale_ratio=p.first/picD.first : scale_ratio=p.second/picD.second;
    
    return scale_ratio;
}


//计算图片在页面上的位置：上下、左右居中
std::pair <double, double> Get_PicInPage_position(std::pair <double, double> p, DoubleAndDoublePair picD)
{
    //此处传入的图像大小，已经过缩放
    double a,b;
    
    //位置为：((X-a')/2,(Y-b')/2)
    
    a=(p.first-picD.first)/2;
    b=(p.second-picD.second)/2;
    
    return std::make_pair(a, b);
}


// 根据图片的位置，及缩放，重新计算文本框各点坐标
void Get_new_box_coordinate(std::vector <std::pair<int, int>> * info_coord_1,
                            std::vector <std::pair<int, int>> * info_coord_2,
                            std::vector <std::pair<int, int>> *  info_coord_3,
                            std::vector <std::pair<int, int>> * info_coord_4,
                            const double scale_ratio,
                            const std::pair <double, double> pic_position,
                            const int i_start=0, //相关内容的索引编号
                            const int i_end=1 )
{
    //位置变换关系为： (a,b) -> (a*r+x,b*r+y)
    for(int i=i_start; i < i_end; i++)
    {
        (*info_coord_1)[i].first = (*info_coord_1)[i].first*scale_ratio + pic_position.first;
        (*info_coord_2)[i].first = (*info_coord_2)[i].first*scale_ratio + pic_position.first;
        (*info_coord_3)[i].first = (*info_coord_3)[i].first*scale_ratio + pic_position.first;
        (*info_coord_4)[i].first = (*info_coord_4)[i].first*scale_ratio + pic_position.first;
        
        (*info_coord_1)[i].second = (*info_coord_1)[i].second*scale_ratio + pic_position.second;
        (*info_coord_2)[i].second = (*info_coord_2)[i].second*scale_ratio + pic_position.second;
        (*info_coord_3)[i].second = (*info_coord_3)[i].second*scale_ratio + pic_position.second;
        (*info_coord_4)[i].second = (*info_coord_4)[i].second*scale_ratio + pic_position.second;
    }
}


//根据字体与文体框大小，计算所需字体大小
double Get_text_font_size(std::pair <int, int> *c_1, //坐标信息
                          std::pair <int, int> *c_2,
                          std::pair <int, int> *c_3,
                          std::pair <int, int> *c_4,
                          std::string *text, //文本
                          PDFUsedFont* use_font //字体信息
)
{
    double font_size;
    
    //利用字体大小的线性关系来求所需大小
    PDFUsedFont::TextMeasures textDimensions_1 = use_font->CalculateTextDimensions(*text,12);
    PDFUsedFont::TextMeasures textDimensions_2 = use_font->CalculateTextDimensions(*text,20);
    
    double width_r=(textDimensions_2.width-textDimensions_1.width)/8;
    double height_r=(textDimensions_2.height-textDimensions_1.height)/8;
    
    //这里默认为水平矩形框，没有处理倾斜的情况
    double with=abs( (*c_1).first-(*c_2).first );
    double height=abs( (*c_1).second-(*c_4).second) ;
    
    with/width_r > height/height_r ? font_size=height/height_r : font_size=with/width_r;
    
    return font_size;
}


